/**
 * 
 */
package uni.edu.pe.analisisSentimental.dao.impl;

import static uni.edu.pe.analisisSentimental.common.Constantes.*;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_INICIO_PROCESO;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_INICIO_PROCESO_WEB;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_1;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_2;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_FASE_TRATAMIENTO_LENGUAJE_RM_1;
import static uni.edu.pe.analisisSentimental.common.Constantes.COD_OPINION_NSC;
import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_HABILITADO;
import static uni.edu.pe.analisisSentimental.common.Constantes.FLAG_INHABILITADO;
import static uni.edu.pe.analisisSentimental.common.Constantes.SIMBOLO_TAG;
import static uni.edu.pe.analisisSentimental.common.Constantes.*;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSourceUtils;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.stereotype.Repository;

import uni.edu.pe.analisisSentimental.common.Constantes;
import uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO;
import uni.edu.pe.analisisSentimental.domain.TweetProcesado;
import uni.edu.pe.analisisSentimental.domain.Url;
import uni.edu.pe.analisisSentimental.dto.OpinionMensajeDto;
import uni.edu.pe.analisisSentimental.dto.TweetProcesadoDto;

/**
 * @author nestor
 *
 */
@Repository
public class TweetProcesadoDAOImpl implements TweetProcesadoDAO {

    private static Logger logger = LoggerFactory.getLogger(TweetProcesadoDAOImpl.class);
	private static final boolean isDebugEnabled = logger.isDebugEnabled();

	// SimpleJdbcTemplate-style...
	private SimpleJdbcTemplate simpleJdbcTemplate;

	@Autowired
	public void setDataSource(DataSource dataSource) {
	    this.simpleJdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#save(uni.edu.pe.analisisSentimental.domain.TweetProcesado)
	 */
	public void save(TweetProcesado tp) {
		logger.debug("<==== Inicio save ====>");	
		if(isDebugEnabled)
			logger.debug("tp: "+ToStringBuilder.reflectionToString(tp));
		String sql =  "INSERT INTO TWEETS_PROCESADOS (IdTweet, TextoActual, FechaHoraInicio, FechaHoraFin, CodOpinionWeb, CodOpinionMensaje, CodOpinionTwitter, CodFaseTwitter, CodFaseWeb, FlagHabilitado)"+
	    "VALUES(:idTweet, :textoActual, :fechaHoraInicio, :fechaHoraFin, :codOpinionWeb, :codOpinionMensaje, :codOpinionTwitter, :codFaseTwitter, :codFaseWeb, :flagHabilitado)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("idTweet", tp.getIdTweet());
		parameters.put("textoActual", tp.getTextoActual());
		parameters.put("fechaHoraInicio", tp.getFechaHoraInicio());
		parameters.put("fechaHoraFin", tp.getFechaHoraFin());
		parameters.put("codOpinionWeb", tp.getCodOpinionWeb());
		parameters.put("codOpinionMensaje", tp.getCodOpinionMensaje());
		parameters.put("codOpinionTwitter", tp.getCodOpinionTwitter());
		parameters.put("codFaseTwitter", tp.getCodFaseTwitter());
		parameters.put("codFaseWeb", tp.getCodFaseWeb());
		parameters.put("flagHabilitado", tp.getFlagHabilitado());
		simpleJdbcTemplate.update(sql,parameters);	
		
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#saveAll(java.util.List)
	 */
	public void saveAll(List<TweetProcesado> ltp) {
		logger.debug("<==== Inicio saveAll ====>");
		if(CollectionUtils.isNotEmpty(ltp)){
			for(TweetProcesado tp: ltp){
				save(tp);
			}
		}		
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#saveAllBatch(java.util.List)
	 */
	public int[] saveAllBatch(List<TweetProcesado> ltp) {
		logger.debug("<==== Inicio saveAllBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(ltp)){
			int size = ltp.size();			
			Map[] tpdtos = new Map[size];
			for(int i=0;i<size;i++){
				TweetProcesado tp = ltp.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("idTweet", tp.getIdTweet());
				parameters.put("textoActual", tp.getTextoActual());
				parameters.put("fechaHoraInicio", tp.getFechaHoraInicio());
				parameters.put("fechaHoraFin", tp.getFechaHoraFin());
				parameters.put("codOpinionWeb", tp.getCodOpinionWeb());
				parameters.put("codOpinionMensaje", tp.getCodOpinionMensaje());
				parameters.put("codOpinionTwitter", tp.getCodOpinionTwitter());
				parameters.put("codFaseTwitter", tp.getCodFaseTwitter());
				parameters.put("codFaseWeb", tp.getCodFaseWeb());
				parameters.put("flagHabilitado", tp.getFlagHabilitado());
				tpdtos[i]=parameters;
			}
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			String sql =  "INSERT INTO TWEETS_PROCESADOS (IdTweet, TextoActual, FechaHoraInicio, FechaHoraFin, CodOpinionWeb, CodOpinionMensaje, CodOpinionTwitter, CodFaseTwitter, CodFaseWeb, FlagHabilitado)"+
		    "VALUES(:idTweet, :textoActual, :fechaHoraInicio, :fechaHoraFin, :codOpinionWeb, :codOpinionMensaje, :codOpinionTwitter, :codFaseTwitter, :codFaseWeb, :flagHabilitado)";
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);	
			tpdtos =null;
			batch=null;
		}		
		return updateCounts;
	}
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#obtenerTweetsParaTratamientoLenguaje()
	 */
	public List<TweetProcesadoDto> obtenerTweetsParaTratamientoLenguaje(String codFinData){
		logger.debug("<==== Inicio Method obtenerTweetsParaTratamientoLenguaje ====>");
		logger.debug("codFinData: {}",codFinData);
		String sql = "Select  distinct tp.IdTweet idTweet, tp.TextoActual texto, st.TextoConsulta query, " +
					 "um.NombrePantallaReceptor screenName, url.urlCorta urlCorta, ht.TextoTag tag, md.url urlMedia "+
					 "from Tweets_procesados tp "+ 
					 "inner join  status_tweet st "+
					 "on st.Idtweet = tp.IdTweet "+
					 "left join user_mentions um "+
					 "on st.IdTweet = um.IdTweet "+
					 "left join url "+
					 "on tp.IdTweet = url.IdTweet "+
					 "left join hashtag ht "+
					 "on tp.IdTweet = ht.IdTweet "+
					 "left join Media md "+
					 "on tp.IdTweet = md.IdTweet "+
					 "where tp.flagHabilitado =:flagHabilitado "+
					 "and tp.CodFaseTwitter = :codFaseTwitter "+
					 "and st.CodFinalidadData = :codFinalidadData "+
					 "order by tp.IdTweet";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagHabilitado", FLAG_HABILITADO);
		parameters.put("codFaseTwitter", COD_FASE_INICIO_PROCESO);
		parameters.put("codFinalidadData", codFinData);
		final Map<Long, TweetProcesadoDto> mapTp= new HashMap<Long, TweetProcesadoDto>();
		 RowMapper<TweetProcesadoDto> mapper = new RowMapper<TweetProcesadoDto>() {  
		        public TweetProcesadoDto mapRow(ResultSet rs, int rowNum) throws SQLException {
		        	 Long idTweet = rs.getLong("idTweet");
		        	 TweetProcesadoDto tpdto = (TweetProcesadoDto) mapTp.get(idTweet);
		             if (tpdto == null) {
		            	 tpdto=new TweetProcesadoDto();
		            	 tpdto.setIdTweet(idTweet);
		            	 tpdto.setTextoInicial(rs.getString("texto"));
		            	 tpdto.setQuery(rs.getString("query"));
		            	 tpdto.getMarcasMensaje().add(tpdto.getQuery());
		            	 mapTp.put(idTweet, tpdto);
		             }
		        	
		        	String screenName = rs.getString("screenName");
		        	if(StringUtils.isNotBlank(screenName)){
		        		tpdto.getMarcasMensaje().add(SIMBOLO_USER+screenName.toLowerCase());
		        	}
		        	
		        	String urlCorta = rs.getString("urlCorta");
		        	if(StringUtils.isNotBlank(urlCorta)){
		        		tpdto.getMarcasMensaje().add(urlCorta.toLowerCase());
		        	}
		        	
		        	String urlMedia = rs.getString("urlMedia");
		        	if(StringUtils.isNotBlank(urlMedia)){
		        		tpdto.getMarcasMensaje().add(urlMedia.toLowerCase());
		        	}
		        	
		        	String tag = rs.getString("tag");
		        	if(StringUtils.isNotBlank(tag)){
		        		tpdto.getMarcasMensaje().add(SIMBOLO_TAG+tag.toLowerCase());
		        	}
		        	
		            return tpdto;
		        }
		    };
		
	    this.simpleJdbcTemplate.query(sql, mapper, parameters);
	    List<TweetProcesadoDto> result = new ArrayList<TweetProcesadoDto>(mapTp.values()); 
	    return  result;

	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#guardarTextoProcesadoTratamientoTwitter(java.util.List)
	 */
	public void guardarTextoProcesadoTratamientoTwitter(
			List<TweetProcesadoDto> ltpdto) {
		logger.debug("<==== Inicio Method guardarTextoProcesadoTratamientoTwitter ====>");
		if(CollectionUtils.isNotEmpty(ltpdto)){
			for(TweetProcesadoDto tpdto: ltpdto){
				guardarTextoProcesadoTratamientoTwitter(tpdto);
			}
		}
		
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#guardarTextoProcesadoTratamientoTwitterBatch(java.util.List)
	 */
	public int[] guardarTextoProcesadoTratamientoTwitterBatch(
			List<TweetProcesadoDto> ltpdto) {
		logger.debug("<==== Inicio Method guardarTextoProcesadoTratamientoTwitterBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(ltpdto)){
			int size = ltpdto.size();
			Map[] tpdtos = new Map[size];
			for(int i=0;i<size;i++){
				TweetProcesadoDto tp = ltpdto.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("idTweet", tp.getIdTweet());
				parameters.put("textoActual", tp.getTextoProcesado());
				parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_1);
				tpdtos[i]=parameters;
			}
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			String sql =  "UPDATE TWEETS_PROCESADOS set TextoActual=:textoActual ,CodFaseTwitter=:codFaseTwitter where IdTweet=:idTweet";
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);	
			tpdtos =null;
			batch=null;
		}

		return updateCounts;

	}
	
  

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#guardarTextoProcesadoTratamientoTwitter(uni.edu.pe.analisisSentimental.dto.TweetProcesadoDto)
	 */
	public void guardarTextoProcesadoTratamientoTwitter(TweetProcesadoDto tp) {
		logger.debug("<==== Inicio Method guardarTextoProcesadoTratamientoTwitter ====>");
		if(isDebugEnabled)
			logger.debug("tpdto: "+ToStringBuilder.reflectionToString(tp));
		String sql =  "UPDATE TWEETS_PROCESADOS set TextoActual=:textoActual ,CodFaseTwitter=:codFaseTwitter where IdTweet=:idTweet";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("idTweet", tp.getIdTweet());
		parameters.put("textoActual", tp.getTextoProcesado());
		parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_1);
		simpleJdbcTemplate.update(sql,parameters);		
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#descartarTweetsNS(java.util.List)
	 */
	public void descartarTweetsNS(List<Long> lstNs) {
		logger.debug("<==== Inicio Method descartarTweetsNS ====>");
		if(CollectionUtils.isNotEmpty(lstNs)){
			for(Long idTns: lstNs){
				descartarTweetsNS(idTns);
			}
		}
		
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#descartarTweetsNSBatch(java.util.List)
	 */
	public int[] descartarTweetsNSBatch(List<Long> lstNs){
		logger.debug("<==== Inicio Method descartarTweetsNSBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(lstNs)){
			int size = lstNs.size();
			Map[] tpdtos = new Map[size];
			for(int i=0;i<size;i++){
				Long idTns = lstNs.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("flagHabilitado", FLAG_INHABILITADO);
				parameters.put("codOpinionWeb", COD_OPINION_NSC);
				parameters.put("codOpinionMensaje", COD_OPINION_NSC);
				parameters.put("codOpinionTwitter", COD_OPINION_NSC);
				parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_1);
				parameters.put("idTweet", idTns);
				tpdtos[i]=parameters;
			}
			
			String sql =  "UPDATE TWEETS_PROCESADOS set FlagHabilitado=:flagHabilitado , CodOpinionWeb=:codOpinionWeb, "+
			  "CodOpinionMensaje=:codOpinionMensaje, CodOpinionTwitter = :codOpinionTwitter, CodFaseTwitter = :codFaseTwitter where IdTweet=:idTweet";
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);
			tpdtos =null;
			batch=null;
		}
		return updateCounts;
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#descartarTweetsNS(java.lang.Long)
	 */
	public void descartarTweetsNS(Long idTns) {
		logger.debug("<==== Inicio Method descartarTweetsNS ====>");	
		if(isDebugEnabled)
			logger.debug("idTns: "+idTns);
		String sql =  "UPDATE TWEETS_PROCESADOS set FlagHabilitado=:flagHabilitado , CodOpinionWeb=:codOpinionWeb, "+
					  "CodOpinionMensaje=:codOpinionMensaje, CodOpinionTwitter = :codOpinionTwitter, CodFaseTwitter = :codFaseTwitter where IdTweet=:idTweet";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagHabilitado", FLAG_INHABILITADO);
		parameters.put("codOpinionWeb", COD_OPINION_NSC);
		parameters.put("codOpinionMensaje", COD_OPINION_NSC);
		parameters.put("codOpinionTwitter", COD_OPINION_NSC);
		parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_1);
		parameters.put("idTweet", idTns);

		simpleJdbcTemplate.update(sql,parameters);	
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#actualizarTweetsProcesadosRM()
	 */
	public void actualizarTweetsProcesadosRM() {
		logger.debug("<==== Inicio Method actualizarTweetsProcesadosRM ====>");
		String sql =  "update tweets_procesados a set textoactual = b.text, codfasetwitter = :codFaseTwitter "+
					  "from tweets_procesados_rm b where a.idtweet = cast(b.idtweet as numeric)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_RM_1);
		
		simpleJdbcTemplate.update(sql,parameters);			
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#limpiarDataTratamientoLenguajeRM()
	 */
	public void limpiarDataTratamientoLenguajeRM() {
		logger.debug("<==== Inicio Method limpiarDataTratamientoLenguajeRM ====>");
		String sql =  "truncate tweets_procesados_rm";
		
		Map<String, Object> parameters = new HashMap<String, Object>();
		
		simpleJdbcTemplate.update(sql, parameters);	
	}


	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#obtenerTweetsParaTratamientoLenguajePostRM()
	 */
	public List<TweetProcesado> obtenerTweetsParaTratamientoLenguajePostRM(String codFinData) {
		logger.debug("<==== Inicio Method obtenerTweetsParaTratamientoLenguajePostRM ====>");
		String sql = "SELECT tp.IdTweet, tp.TextoActual, tp.FlagHabilitado FROM TWEETS_PROCESADOS tp INNER JOIN STATUS_TWEET st on tp.IdTweet = st.IdTweet "+
					"WHERE FlagHabilitado = :flagHabilitado and CodFaseTwitter=:codFaseTwitter and CodFinalidadData=:codFinalidadData"; 
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagHabilitado", FLAG_HABILITADO);
		parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_RM_1);
		parameters.put("codFinalidadData", codFinData);
		 RowMapper<TweetProcesado> mapper = new RowMapper<TweetProcesado>() {  
		        public TweetProcesado mapRow(ResultSet rs, int rowNum) throws SQLException {
		        	TweetProcesado tp = new TweetProcesado();
		            tp.setIdTweet(rs.getLong("IdTweet"));
		            tp.setTextoActual(rs.getString("TextoActual"));	
		            tp.setFlagHabilitado(rs.getInt("FlagHabilitado"));		
		            return tp;
		        }
		    };

	    return this.simpleJdbcTemplate.query(sql, mapper, parameters);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#guardarTweetsTratadosPorFaseTwitter(java.util.List)
	 */
	public void guardarTweetsTratadosPorFaseTwitter(List<TweetProcesado> ltp) {
		if(CollectionUtils.isNotEmpty(ltp)){
			for(TweetProcesado tp:ltp){
				guardarTweetsTratadosPorFaseTwitter(tp);
			}
		}		
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#guardarTweetsTratadosPorFaseTwitterBatch(java.util.List)
	 */
	public int[] guardarTweetsTratadosPorFaseTwitterBatch(List<TweetProcesado> ltp) {
		logger.debug("<==== Inicio Method guardarTweetsTratadosPorFaseTwitterBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(ltp)){
			int size = ltp.size();			
			Map[] tpdtos = new Map[size];
			for(int i=0;i<size;i++){
				TweetProcesado tp = ltp.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("textoActual", tp.getTextoActual());
				parameters.put("codFaseTwitter", tp.getCodFaseTwitter());
				parameters.put("codOpinionTwitter", tp.getCodOpinionTwitter());
				parameters.put("flagHabilitado", tp.getFlagHabilitado());
				parameters.put("idTweet", tp.getIdTweet());
				tpdtos[i]=parameters;
			}
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			String sql =  "UPDATE TWEETS_PROCESADOS set TextoActual=:textoActual, CodFaseTwitter=:codFaseTwitter, " +
			"CodOpinionTwitter=COALESCE(:codOpinionTwitter, CodOpinionTwitter), " +
			"FlagHabilitado=COALESCE(:flagHabilitado, FlagHabilitado) " +
			"where IdTweet=:idTweet";
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);	
			tpdtos =null;
			batch=null;
		}	
		
		return updateCounts;

	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#guardarTweetsTratadosPorFaseTwitter(uni.edu.pe.analisisSentimental.domain.TweetProcesado)
	 */
	public void guardarTweetsTratadosPorFaseTwitter(TweetProcesado tp) {
		logger.debug("<==== Inicio Method guardarTweetsTratadosPorFaseTwitter ====>");	
		/*if(isDebugEnabled)
			logger.debug("tp: "+tp.getIdTweet());*/
		String sql =  "UPDATE TWEETS_PROCESADOS set TextoActual=:textoActual, CodFaseTwitter=:codFaseTwitter, " +
						"CodOpinionTwitter=COALESCE(:codOpinionTwitter, CodOpinionTwitter), " +
						"FlagHabilitado=COALESCE(:flagHabilitado, FlagHabilitado) " +
						"where IdTweet=:idTweet";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("textoActual", tp.getTextoActual());
		parameters.put("codFaseTwitter", tp.getCodFaseTwitter());
		parameters.put("codOpinionTwitter", tp.getCodOpinionTwitter());
		parameters.put("flagHabilitado", tp.getFlagHabilitado());
		parameters.put("idTweet", tp.getIdTweet());

		simpleJdbcTemplate.update(sql,parameters);	
		
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#obtenerTweetsParaAnalisisSubjetividadCo()
	 */
	public List<TweetProcesado> obtenerTweetsParaAnalisisSubjetividadCo(String codFinData) {
		logger.debug("<==== Inicio Method obtenerTweetsParaAnalisisSubjetividadCo ====>");
		String sql = "SELECT tp.IdTweet, tp.TextoActual, tp.CodOpinionTwitter, tp.FlagHabilitado FROM TWEETS_PROCESADOS tp INNER JOIN STATUS_TWEET st on tp.IdTweet = st.IdTweet "+
					 "WHERE FlagHabilitado = :flagHabilitado and CodFaseTwitter=:codFaseTwitter  and CodFinalidadData=:codFinalidadData order by IdTweet";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagHabilitado", FLAG_HABILITADO);
		parameters.put("codFaseTwitter", COD_FASE_TRATAMIENTO_LENGUAJE_JAVA_2);
		parameters.put("codFinalidadData", codFinData);
		 RowMapper<TweetProcesado> mapper = new RowMapper<TweetProcesado>() {  
		        public TweetProcesado mapRow(ResultSet rs, int rowNum) throws SQLException {
		        	TweetProcesado tp = new TweetProcesado();
		            tp.setIdTweet(rs.getLong("IdTweet"));
		            tp.setTextoActual(rs.getString("TextoActual"));
		            tp.setCodOpinionTwitter(rs.getString("CodOpinionTwitter"));
		            tp.setFlagHabilitado(rs.getInt("FlagHabilitado"));		
		            return tp;
		        }
		    };

	    return this.simpleJdbcTemplate.query(sql, mapper, parameters);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#actualizarTweetsProcesadosC1()
	 */
	public void actualizarTweetsProcesadosC1() {
		logger.debug("<==== Inicio Method actualizarTweetsProcesadosC1 ====>");
		String sql =  "update tweets_procesados a set codfasetwitter = :codFaseTwitter, " +
													 "codopiniontwitter = \"b\".\"prediction(codopinion)\" " +
					  "from tweets_procesados_rm b where a.idtweet = cast(b.idtweet as numeric)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("codFaseTwitter", COD_FASE_ANALISIS_SUBJETIVIDAD_RM_1);
		
		simpleJdbcTemplate.update(sql,parameters);
	}
	
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#actualizarTweetsProcesadosC2()
	 */
	public void actualizarTweetsProcesadosC2() {
		logger.debug("<==== Inicio Method actualizarTweetsProcesadosC2 ====>");
		String sql =  "update tweets_procesados a set codfasetwitter = :codFaseTwitter, " +
		 											 "codopiniontwitter = \"b\".\"prediction(codopinion)\" " +
					  "from tweets_procesados_rm b where a.idtweet = cast(b.idtweet as numeric)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("codFaseTwitter", COD_FASE_ANALISIS_SENTIMIENTO);
		
		simpleJdbcTemplate.update(sql,parameters);
	}
	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#actualizarTweetsProcesados(java.util.List)
	 */
	public int[] actualizarFaseTweetsProcesadosWebBatch(List<Url> ltpUrl) {
		logger.debug("<==== Inicio Method actualizarFaseTweetsProcesadosWebBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(ltpUrl)){
			int size = ltpUrl.size();
			Map[] tpdtos = new Map[size];
			for(int i=0;i<size;i++){
				Url tp = ltpUrl.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("idTweet", tp.getIdTweet());
				parameters.put("codFaseWeb", COD_FASE_INICIO_PROCESO_WEB);
				tpdtos[i]=parameters;
			}
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			String sql =  "UPDATE TWEETS_PROCESADOS set CodFaseWeb=:codFaseWeb where IdTweet=:idTweet";
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);	
			tpdtos =null;
			batch=null;
		}

		return updateCounts;
		
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#sintetizarOpinionMensajeBatch(java.util.List)
	 */
	public int[] sintetizarOpinionMensajeBatch(List<OpinionMensajeDto> lstOm) {
		logger.debug("<==== Inicio Method sintetizarOpinionMensajeBatch ====>");
		int[] updateCounts = null;
		if(CollectionUtils.isNotEmpty(lstOm)){
			int size = lstOm.size();
			Map[] tpdtos = new Map[size];
			for(int i=0;i<size;i++){
				OpinionMensajeDto om = lstOm.get(i);
				Map<String, Object> parameters = new HashMap<String, Object>();
				parameters.put("codOpinionMensaje", om.getCodOpinionMensaje());
				parameters.put("codOpinionMsjInicial", om.getCodOpinionMsjInicial());
				parameters.put("fechaHoraFin",new Date());
				parameters.put("flagHabilitado", Constantes.FLAG_TERMINADO);
				parameters.put("idTweet", om.getIdTweet());
				tpdtos[i]=parameters;
			}
			SqlParameterSource[] batch = SqlParameterSourceUtils.createBatch(tpdtos);
			String sql =  "UPDATE TWEETS_PROCESADOS set CodOpinionMensaje=:codOpinionMensaje, " +
						"CodOpinionMsjInicial=:codOpinionMsjInicial, FechaHoraFin=:fechaHoraFin, " +
						"FlagHabilitado=:flagHabilitado where IdTweet=:idTweet";
			updateCounts = simpleJdbcTemplate.batchUpdate(sql,batch);	
			tpdtos =null;
			batch=null;
		}

		return updateCounts;
		
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#obtenerTweetsEvaluacionPerformance(java.lang.String)
	 */
	public List<TweetProcesado> obtenerTweetsEvaluacionPerformance(String codFinalidadData) {
		logger.debug("<==== Inicio Method obtenerTweetsEvaluacionPerformance ====>");
		String sql = "SELECT tp.IdTweet, tp.CodOpinionMensaje, tp.CodOpinionMsjInicial " +
					"FROM TWEETS_PROCESADOS tp " +
					"INNER JOIN STATUS_TWEET st on tp.IdTweet = st.IdTweet "+
					 "WHERE tp.FlagHabilitado = :flagHabilitado " +
					 "and st.CodFinalidadData=:codFinalidadData";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("flagHabilitado", FLAG_TERMINADO);		
		parameters.put("codFinalidadData", codFinalidadData);
		 RowMapper<TweetProcesado> mapper = new RowMapper<TweetProcesado>() {  
		        public TweetProcesado mapRow(ResultSet rs, int rowNum) throws SQLException {
		        	TweetProcesado tp = new TweetProcesado();
		            tp.setIdTweet(rs.getLong("IdTweet"));
		            tp.setCodOpinionMensaje(rs.getString("CodOpinionMensaje"));
		            tp.setCodOpinionMsjInicial(rs.getString("CodOpinionMsjInicial"));
		            return tp;
		        }
		    };

	    return this.simpleJdbcTemplate.query(sql, mapper, parameters);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#actualizarUrlsProcesadasC1()
	 */
	public void actualizarUrlsProcesadasC1() {
		logger.debug("<==== Inicio Method actualizarUrlsProcesadasC1 ====>");
		String sql =  "update tweets_procesados a set codfaseweb = :codFaseWeb, " +
													 "codopinionweb = \"b\".\"prediction(label)\" " +
					  "from tweets_procesados_rm b where a.idtweet = cast(b.idtweet as numeric)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("codFaseWeb", COD_FASE_ANALISIS_SUBJETIVIDAD_RM_WEB);
		
		simpleJdbcTemplate.update(sql,parameters);
	}

	/*
	 * (non-Javadoc)
	 * @see uni.edu.pe.analisisSentimental.dao.TweetProcesadoDAO#actualizarUrlsProcesadasC2()
	 */
	public void actualizarUrlsProcesadasC2() {
		logger.debug("<==== Inicio Method actualizarUrlsProcesadasC2 ====>");
		String sql =  "update tweets_procesados a set codfaseweb = :codFaseWeb, " +
													 "codopinionweb = \"b\".\"prediction(label)\" " +
					  "from tweets_procesados_rm b where a.idtweet = cast(b.idtweet as numeric)";
		Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("codFaseWeb", COD_FASE_ANALISIS_SENTIMIENTO_RM_WEB);
		
		simpleJdbcTemplate.update(sql,parameters);
	}
}
